﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Management;
using System.IO;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
using System.ServiceProcess;


delegate void delegListBeginEndUpdate(int what);                //делегат для начала вызова начала прорисовки и конца прорисовки лист бокса,BeginUpdate -1,EndUpdate -0
delegate void delegListClear();                                  //очистка лист бокса
delegate void delegListAdd(object item);                         //добавление элементов в лист бокс      
delegate void delegLabelText(Label label,string str);           //обновляем тест на лэйблах 
delegate void delegListItemInd(int ind,string str);
delegate void delegFormText(string str);
delegate void delegSetToolTip(Control control,string str);

//delegate void delegTextadd(string str);

delegate void delegDataAdd(params object[] item);
delegate void delegGetDataValue(int nRow, int nCell);
delegate void delegPutDataValue(int nRow, int nCell, string inf);
delegate void delegPutImag(int nRow, int nCell, Image im);
delegate void delegRowsCount();
delegate void delegRowsClear();
delegate void delegRowsRemove(int Nrow);
delegate void delegDataEnab(bool v);
delegate void delegSetMaxPrbar(int max);
delegate void delegSetValuePrbar(int value);
delegate void delegPrBarVisEnab(bool v);

namespace KillProcesss
{
    public partial class Form1 : Form
    {
        int colv = 0, colv1 = 0, colv2 = 0, ColvThred = 0, ColvHandles = 0;   //колв-проц для listBox и DataGrid2
        int KolSt, TabPage = 0,Tab0st = 0, UpdServ = 1,lab3kl=0,lab4kl=0,ListSelect=0;
        volatile String DataValue;
        volatile int rowcount;
        ArrayList myList = new ArrayList();  //безразмерный массив для хранения структур из Netstat
        ArrayList myList1 = new ArrayList();
        string[] srvInf = new string[5];  //5 стрингов для инфы о службах
        public Thread t,t1,tt1,tst;
        Icon ic;
        bool Idel = false,bigApp = false,firstplayDel = true,XP=false;
        PerformanceCounter performanceCounter4, performanceCounter5, performanceCounter6;
        //int zav = 0, bufzav = 0;
        //bool update = false;

        struct ProcList: IComparable <ProcList>  //класс со своим сравнителем для списка процесссов в listbox
        {
            public string Name;
            public string Pid;

            public int CompareTo(ProcList other) //сравнитель по имени
            {
                return this.Name.CompareTo(other.Name);
            }
        }
        List<ProcList> Plist = new List<ProcList>();  //создали объект списка для элементов опис выше со своим сравнителем
        ProcList pl;                        //объект который мы будем добавлять в список выше после заполнения

        public struct ProcInf
        {
            public string Name;
            public string Pid;
            public string Priority;
            public string FizMEMusage;
            public string PeakFizMEMusage;
            public string VirtMEMusage;
            public string PeakVirtMEMusage;
            public string PagedMEMSize;
            public string PagedSysMEMSize;
            public string NonpagedSysMEMSize;
            public string CPU;
            public string CPUtime;
            public string Handles;
            public string Threads;
            public string MachineName;
            public string StartTime;
            public string SessionID;
            public Image Ris;

        }; 
        ProcInf PInf;
        
        public struct NetStat   //структура с инф о процесса в сети
        {
            public string protocol;
            public string locadr;
            public string vnadr;
            public string sost;
            public int pid;
        };
        NetStat NInf;

        const int HOTKEY_ID = 31197;    //любое число, которое будет использоваться в качестве идентификатора в рамках этого приложения
        const int WM_HOTKEY = 0x0312;  //хот кей
        const int WM_QUERYENDSESSION = 0x11;  //завершение сеанса пользователя
        static bool systemShutdown = false; //флаг о завершении сеанса

       [DllImport("user32")]
       private static extern bool HideCaret(IntPtr hWnd); 
       
         public enum KeyModifiers        //перечисление для вызова третьего параметра RegisterHotkey 
        {
            None = 0,
            Alt = 1,
            Control = 2,
            Shift = 4,
            Windows = 8
        }
        //API Imports
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
            IntPtr hWnd, // handle to window for which register hot-key  
            int id, // hot key identifier    
            KeyModifiers fsModifiers, // key-modifier options    
            Keys vk    // virtual-key code    
            );

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd, // handle to window    
            int id      // hot key identifier    
            );

       
        public Form1()
        {
            InitializeComponent();
            try //закончим иниц каунтеров тут т.к. может быть исключение
            {
                ((System.ComponentModel.ISupportInitialize)(this.performanceCounter1)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.performanceCounter2)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.performanceCounter3)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.performanceCounter7)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.performanceCounter8)).EndInit();
          
            // System.Management.WqlObjectQuery q = 
            //    new System.Management.WqlObjectQuery("SELECT * FROM Win32_OperatingSystem");
            //System.Management.ManagementObjectSearcher find = 
            //    new System.Management.ManagementObjectSearcher(q);
            //foreach (System.Management.ManagementObject mo in find.Get())
            //{
            //    os = mo["Caption"].ToString();
            //}
            //после инициализации всех компонентов зпкончим иницализ нашаих каунтеров в зависимости от ОС
              if (System.Environment.OSVersion.Version.Major < 6) //начиная с 6 это виста и 7 а 5 это ХР
              {
                XP = true;
                performanceCounter6 = new PerformanceCounter();
                //((System.ComponentModel.ISupportInitialize)(this.performanceCounter6)).EndInit();
                performanceCounter6.CategoryName = "IP";
                performanceCounter6.CounterName = "Datagrams/sec";
              }
              else
              {
                XP = false;
                performanceCounter4 = new PerformanceCounter();
                performanceCounter5 = new PerformanceCounter();
                performanceCounter4.CategoryName = "IPv4";
                performanceCounter4.CounterName = "Datagrams/sec";
                performanceCounter5.CategoryName = "IPv6";
                performanceCounter5.CounterName = "Datagrams/sec";
               // ((System.ComponentModel.ISupportInitialize)(this.performanceCounter4)).EndInit();
               // ((System.ComponentModel.ISupportInitialize)(this.performanceCounter5)).EndInit();
               
              }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); };
            //  Environment.GetFolderPath(Environment.SpecialFolder.Startup); //путь к каталогу "автозагрузка"
            
            //для скрытия формы при старте
             this.ShowInTaskbar = false; 
             this.WindowState = FormWindowState.Minimized;
             this.StartPosition = FormStartPosition.Manual;
             
            try
            {
                checkBox1.Checked = Properties.Settings.Default.autostart;
            }
            catch { }

            //регистрируем хот кеи - возвращ знач только для отладки
            bool bcheck = RegisterHotKey(Handle, HOTKEY_ID, KeyModifiers.Control, Keys.Oemtilde);

            t = new Thread(UpdateListProc);
            t.Start();
            tst = new Thread(InfProc);
            tst.Start();
            timer2.Start();

            tabPage3.Enter += new EventHandler(tabPage3_Enter);  //событие нажатия на 3 ий таб контрол со службами
            
            //выравнивание ячее направо
            dataGridView1.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight; 
            dataGridView1.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight; 
            dataGridView1.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight; 
            dataGridView1.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[7].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[8].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[9].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[10].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[11].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[12].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[13].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[14].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[15].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns[16].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight; 

            toolTip1.SetToolTip(button1,"Развернуть");
            toolTip1.SetToolTip(button2,"Закрыть выбранный процесс (del)");
            toolTip1.SetToolTip(button3,"Информация о выбранном процессе (Space)");
            toolTip1.SetToolTip(button4,"Запустить/перезагрузить оболочку Windows");
            toolTip1.SetToolTip(button5,"Выполнить...");
            toolTip1.SetToolTip(button6,"О программе");
            toolTip1.SetToolTip(button7,"Обновить список");
            toolTip1.SetToolTip(listBox1,"Двойной клик - закрыть процесс");
            toolTip1.SetToolTip(label1,"Общая память Мб");
            toolTip1.SetToolTip(label2,"Общая физическая память Мб");
            toolTip1.SetToolTip(label3,"Свободно общей памяти Мб");
            toolTip1.SetToolTip(label4,"Свободно физической памяти Мб");
            toolTip1.SetToolTip(label5,"Идентификатор процесса");
            toolTip1.SetToolTip(label6,"Количество потоков");
            toolTip1.SetToolTip(checkBox1,"Запускать вместе с Windows");
            

           //установим скрытое св-во DoubleBuffered для dataGridView1
           if (System.Windows.Forms.SystemInformation.TerminalServerSession)
               return;
           System.Reflection.PropertyInfo aProp =
                 typeof(System.Windows.Forms.Control).GetProperty(
                       "DoubleBuffered",
                       System.Reflection.BindingFlags.NonPublic |
                       System.Reflection.BindingFlags.Instance);
           aProp.SetValue(dataGridView1, true, null);

           Control.CheckForIllegalCrossThreadCalls = false; //обращение из др потока компилятор не отслеживает
         }
        private void Form1_Load(object sender, EventArgs e)  //скрываем форму сразу при загрузке т.к. в конструкторе выставили minimized
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Hide();
            }
        }

         private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //reset hotkey if exit  (return value here only for debugging)
            bool bcheck = UnregisterHotKey(Handle, HOTKEY_ID);
             if (t != null)   //если поток создан т.е. потоковая переменная не равна 0
                if (t.IsAlive)  //если поток выполняется
                    t.Abort();  //то его завершаем  
             if (t1 != null)   
                 if (t1.IsAlive)  
                     t1.Abort();
             if (tt1 != null)
                 if (tt1.IsAlive)
                     tt1.Abort();
             if (tst != null)
                 if (tst.IsAlive)
                     tst.Abort(); 
        }

 //---------------------------------------------------------------------------------------------------------------------
      
        //---ListBox--------
        private void UpdateListProc() //обновление лист бокс
        {
            try
            {
                GC.AddMemoryPressure(7000);
                while (true)
                {
                    t.Join(1000);   //секундная пауза чтобы меньше грузить проц 
                    GC.Collect();
                    //    foreach (Process p in Process.GetProcesses())
                    //    {
                    //        // Обновляем информацию о процессе
                    //        //  p.Refresh();
                    //        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    //        if (!p.Responding)
                    //            zav++; //каждый раз считаем число зависших процессов

                    //        p.Close();
                    //    }

                    //    if (zav != bufzav)  //если чило зависших сейчас != чилу зависших ранее,т.е. ктот новый завис или ктот отвис
                    //    {
                    //        bufzav = zav;  //сохраняем число зависших и обновляем
                    //        update = true; //флаг о том что нужно обновить лист
                    //    }
                    //    zav = 0; //именно тут а не после if


                    if ((Process.GetProcesses().Length != colv1) /*|| (update == true)*/)   //если текущее колво процессов не равно колву процессов полученному ранее(т.е. произошли изменения в списке проц удалили или добавили проц)*/
                    {
                        //    update = false;

                        colv1 = Process.GetProcesses().Length;
                        ListBeginEndUpdate(1);    //listBox1.BeginUpdate();
                        ListClear();             //listBox1.Items.Clear();
                        Plist.Clear();        //чистим наш динам спис
                       
                        foreach (Process p in Process.GetProcesses()) //обновим лист
                        {

                            if (!p.Responding) //если окно не отвечает
                            {
                                pl.Name = "<!> " + p.ProcessName + ".exe";
                                pl.Pid = p.Id.ToString();
                                Plist.Add(pl);
                                ListAdd(pl.Name);         //listBox1.Items.Add();
                            }
                            else
                            {
                                pl.Name = p.ProcessName + ".exe";
                                pl.Pid = p.Id.ToString();
                                Plist.Add(pl);
                                ListAdd(pl.Name);
                            }
                            ColvThred += p.Threads.Count;
                            p.Close();
                        }
                        Plist.Sort(); //сортируем наш список процессов с их пид по заданному компаратору т.к. лист бокс тоже сортируется                      
                        ListBeginEndUpdate(0);                 //listBox1.EndUpdate();
                        //LabelText(label1, colv1.ToString());    //label1.Text = colv1.ToString();  //сохраняем новое колво процессов

                        if (firstplayDel) //запуск перв раз или удалили проц
                        {
                            firstplayDel = false;
                            listBox1.SelectedIndex = 0; //выделили перв позицию
                        }
                        else listBox1.SelectedIndex = ListSelect;
                    }
                }
            }
            catch { }
        }  
     
        private void ListBeginEndUpdate(int what)//хитрая добавлялка на основе делегата т.к. в др потоке не доступны все наши лейблы и др элементы
        {
            if (this.listBox1.InvokeRequired)   //если этот метод вызван из ДРУГОГО ПОТОКА
            {
                delegListBeginEndUpdate d = new delegListBeginEndUpdate(ListBeginEndUpdate);   //заводим делегата
                this.Invoke(d, new object[] { what });   //invoke выполняет указанный делегат(d) в том потоке которому принадлежит список оргументов т.е. т.к. object принадлежит основному потоку то делегат будет выполнен в этом потоке,и делегат вызовет опять этуже функцию 
            }
            else     
            {
                if (what == 1)
                    this.listBox1.BeginUpdate();
                else if (what == 0)
                    this.listBox1.EndUpdate();
                else return;
            }
        }
        private void ListClear()
        {
            if (this.listBox1.InvokeRequired)  
            {
                delegListClear d = new delegListClear(ListClear);   
                this.Invoke(d, new object[] { });  
            }
            else
            {
                this.listBox1.Items.Clear();
               // this.listBox4.Items.Clear();
            }
        }
        private void ListAdd(object item)
        {
            if (this.listBox1.InvokeRequired)
            {
                delegListAdd d = new delegListAdd(ListAdd);
                this.Invoke(d, new object[] { item });
            }
            else
            {
                this.listBox1.Items.Add(item);
            }
        }
        private void LabelText(Label label, string str)
        {
            if (this.listBox1.InvokeRequired)
            {
                delegLabelText d = new delegLabelText(LabelText);
                this.Invoke(d, new object[] { label,str });
            }
            else
            {
                label.Text = str;  //каккой label пришёл в тот и добавили текст
            }
        }
        private void ListItemInd(int ind,string str)
        {
            if (this.listBox1.InvokeRequired)
            {
                delegListItemInd d = new delegListItemInd(ListItemInd);
                this.Invoke(d, new object[] { ind,str });
            }
            else
            {
                listBox1.Items[ind] = str;
            }
        }

        private void listBox1_MouseDown(object sender, MouseEventArgs e) //перед нажатием на прав кнопку
        {
            if (e.Button == MouseButtons.Right)
            {
                try
                {
                    if (listBox1.SelectedIndex != -1) //если выбрали что то
                    {
                        информацияОПроцессеToolStripMenuItem.Visible = true;
                        информацияОПроцессеToolStripMenuItem.Enabled = true;

                        listBox1.SelectedIndex = listBox1.IndexFromPoint(new Point(e.X, e.Y)); //выделяем
                        ListSelect = listBox1.SelectedIndex;

                        int id = Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid);
                        Process p = Process.GetProcessById(id);

                        try
                        {
                            switch (p.PriorityClass)
                            {
                                case ProcessPriorityClass.AboveNormal:
                                    {
                                        приор4toolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.BelowNormal:
                                    {
                                        приор2toolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.High:
                                    {
                                        приор5ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.Idle:
                                    {
                                        приор1ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.Normal:
                                    {
                                        приор3ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.RealTime:
                                    {
                                        приор6ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                            }
                            contextMenuStrip2.Show(Cursor.Position.X, Cursor.Position.Y);
                        }
                        catch
                        {
                            приор3ToolStripMenuItem.Image = Properties.Resources.priority;
                            приор1ToolStripMenuItem.Image = null;
                            приор2toolStripMenuItem.Image = null;
                            приор4toolStripMenuItem.Image = null;
                            приор5ToolStripMenuItem.Image = null;
                            приор6ToolStripMenuItem.Image = null;
                            contextMenuStrip2.Show(Cursor.Position.X, Cursor.Position.Y);
                        }
                    }
                }
                catch { }
            }
        }
            
        //----inf proc---DataGrid1
     
        private void AddDelDataGrid()    //добавл и удал инфы из datagrid (стартово и при приходе уходе нов проц)
        {
            int da = 0;
            int da1 = 0;
            int b = 0;
            try
            {
                while (true)
                {
                    if (colv != Process.GetProcesses().Length) //если кол-во проц изменилось т.е. реалное не равно тому что в таблице
                    {
                        if (t1 != null)  //останавливаем realtime обновление
                            if (t1.IsAlive)
                            {
                                t1.Abort();
                                t1.Join();
                                t1 = null;
                            }

                        //---------------------------------------
                        if (colv < Process.GetProcesses().Length) //стало больше
                        {
                            colv = Process.GetProcesses().Length;

                            b = 0;
                            DataEnab(false); //Disable Datagrid там за одно и listbox2,3 чтобы пока идёт прогресс бар листы были не доступны
                            PrBarVisEnab(true);
                            SetMaxPrbar(colv);

                            foreach (Process p in Process.GetProcesses()) //берём процесс
                            {
                                b++;
                                SetValuePrbar(b);
                                da = 0;
                                RowsCount();
                                for (int i = 0; i < rowcount; i++) //проходим по всем строкам data grid
                                {
                                    GetDataValue(i, 2);
                                    if (String.Compare(DataValue, p.Id.ToString()) == 0) //если встретили такойтакой Pid в таблице то берём следующий и так пока не дойдём до нового который не встретим тут
                                    {
                                        da++;
                                        break; //переходим к следующему pid если нашли этот
                                    }
                                }
                                if (da == 0) //если не нашли в таблице такого pid то нужно добавить его
                                {
                                    GetInfProc(p);
                                    //иначе если в datagrid нету такого процесса то добавим его туда с инфой
                                    DataAdd(PInf.Ris, PInf.Name, PInf.Pid, PInf.Priority
                                        , PInf.FizMEMusage, PInf.PeakFizMEMusage, PInf.VirtMEMusage
                                        , PInf.PeakVirtMEMusage, PInf.PagedMEMSize, PInf.PagedSysMEMSize
                                        , PInf.NonpagedSysMEMSize, PInf.CPU, PInf.CPUtime
                                        , PInf.Handles, PInf.Threads, PInf.StartTime
                                        , PInf.SessionID);
                                }

                            }
                            PrBarVisEnab(false);
                            DataEnab(true);
                        }
                        else if ((colv > Process.GetProcesses().Length) && Idel == false) //стало меньше но это не мы удалили а сам проц ушел
                        {
                            colv = Process.GetProcesses().Length;  //сохраняем число процесов в таблице
                            RowsCount();
                            for (int i = 0; i < rowcount; i++) //берем очередную строку
                            {
                                da1 = 0;
                                foreach (Process p in Process.GetProcesses()) //пробегам по всем проц
                                {
                                    GetDataValue(i, 2);
                                    if (String.Compare(DataValue, p.Id.ToString()) == 0) //если в массиве реалных процессов есть процесс который в очередной строке
                                    {
                                        da1++;
                                        break; //переходим к следующей строке
                                    }
                                }
                                if (da1 == 0) //если не нашли такой строки в массиве реальных процессов то удалим эту строку из таблицы
                                {
                                    RowsRemove(i);
                                }
                            }
                        }
                        //---------------------------------------
                        Idel = false; //т.к. если мы чёто удалили то Idel == true; и после прохождения if на уменьшение числа проц мы его опять ставим false что бы если проц сам удалился то if выше сработал


                    }
                    else if ((colv == Process.GetProcesses().Length) && Idel == false) //если колво процессов в таблице уже совпад с реальн(т.е. добавили всё чё надо) то включим поток рел тайм
                    {                                                                  //Idel == false чтобы случайно не запустить поток реал тайм при удалении процесса т.е. нам нужно дождаться когда Idel станет false это только после проыерки на изменение кол-ва
                        if (t1 == null)        //только если поток рел тайм не существует
                        {                      // т.к. чтобы в цикле лишний раз его не запустить
                            t1 = new Thread(UpdateDataGrid);
                            t1.Start();
                        }
                    }
                }
            }
            catch { }
        }
        private void UpdateDataGrid()    //обновление строк в dataGrid
        {
            try
            {
                while (true)
                {
                    t1.Join(10000);
                    GC.Collect();
                    foreach (Process p in Process.GetProcesses())
                    {
                        // Обновляем информацию о процессе
                        //  p.Refresh();

                        GetInfProc(p); //получаем инфу о процессах в структуру PInf
                        //=======================================================================================   
                        RowsCount();
                        for (int i = 0; i < rowcount; i++) // передвигаемся по строкам
                        {
                            GetDataValue(i, 2);
                            if (String.Compare(DataValue, PInf.Pid) == 0) //ищем процесс по pid в datagrid во 2 столбце
                            {
                                //еcли нашли процесс с таким пидом в datagrid то пердвигаемся по столбцам и сравниваем содержимое 
                                GetDataValue(i, 1); //получить значение из i стр 1 ячейки
                                if (String.Compare(DataValue, PInf.Name) != 0)
                                {
                                    PutDataValue(i, 1, PInf.Name); //dataGridView1.Rows[i].Cells[1].Value = PInf.Name;
                                }
                                GetDataValue(i, 3);
                                if (String.Compare(DataValue, PInf.Priority) != 0)
                                {
                                    PutDataValue(i, 3, PInf.Priority);
                                }
                                GetDataValue(i, 4);
                                if (String.Compare(DataValue, PInf.FizMEMusage) != 0)
                                {
                                    PutDataValue(i, 4, PInf.FizMEMusage);
                                }
                                GetDataValue(i, 5);
                                if (String.Compare(DataValue, PInf.PeakFizMEMusage) != 0)
                                {
                                    PutDataValue(i, 5, PInf.PeakFizMEMusage);
                                }
                                GetDataValue(i, 6);
                                if (String.Compare(DataValue, PInf.VirtMEMusage) != 0)
                                {
                                    PutDataValue(i, 6, PInf.VirtMEMusage);
                                }
                                GetDataValue(i, 7);
                                if (String.Compare(DataValue, PInf.PeakVirtMEMusage) != 0)
                                {
                                    PutDataValue(i, 7, PInf.PeakVirtMEMusage);
                                }
                                GetDataValue(i, 8);
                                if (String.Compare(DataValue, PInf.PagedMEMSize) != 0)
                                {
                                    PutDataValue(i, 8, PInf.PagedMEMSize);
                                }
                                GetDataValue(i, 9);
                                if (String.Compare(DataValue, PInf.PagedSysMEMSize) != 0)
                                {
                                    PutDataValue(i, 9, PInf.PagedSysMEMSize);
                                }
                                GetDataValue(i, 10);
                                if (String.Compare(DataValue, PInf.NonpagedSysMEMSize) != 0)
                                {
                                    PutDataValue(i, 11, PInf.NonpagedSysMEMSize);
                                }
                                GetDataValue(i, 11);
                                if (String.Compare(DataValue, PInf.CPU) != 0)
                                {
                                    PutDataValue(i, 11, PInf.CPU);
                                }
                                GetDataValue(i, 12);
                                if (String.Compare(DataValue, PInf.CPUtime) != 0)
                                {
                                    PutDataValue(i, 12, PInf.CPUtime);
                                }
                                GetDataValue(i, 13);
                                if (String.Compare(DataValue, PInf.Handles) != 0)
                                {
                                    PutDataValue(i, 13, PInf.Handles);
                                }
                                GetDataValue(i, 14);
                                if (String.Compare(DataValue, PInf.Threads) != 0)
                                {
                                    PutDataValue(i, 14, PInf.Threads);
                                }
                                GetDataValue(i, 15);
                                if (String.Compare(DataValue, PInf.StartTime) != 0)
                                {
                                    PutDataValue(i, 15, PInf.StartTime);
                                }
                                //if (String.Compare(dataGridView1.Rows[i].Cells[16].Value.ToString(), PInf.MachineName) != 0)
                                //{
                                //    dataGridView1.Rows[i].Cells[16].Value = PInf.MachineName;
                                //}  
                                GetDataValue(i, 16);
                                if (String.Compare(DataValue, PInf.SessionID) != 0)
                                {
                                    PutDataValue(i, 16, PInf.SessionID);
                                }
                                //GetDataValue(i, 0);
                                //if (String.Compare(DataValue, PInf.Ris.) != 0)
                                //{
                                //    PutImag(i, 0, PInf.Ris);
                                //}

                            }
                        }
                    }
                }
            }
            catch { }
        }     
        private void GetInfProc(Process p)
        {
            //заполняемся инфой
            try
            {
                ic = Icon.ExtractAssociatedIcon(p.MainModule.FileName);
                PInf.Ris = ic.ToBitmap();
            }
            catch { PInf.Ris = Properties.Resources.system; } //если нету то грузим из ресурсов(атоматически создался там get для добавленного файла)

            if (!p.Responding)
                PInf.Name = "<!> " + p.ProcessName + ".exe"; 
            else PInf.Name = p.ProcessName + ".exe";

            PInf.Pid = p.Id.ToString();
            try
            {
                TimeSpan cputime = p.PrivilegedProcessorTime;
                PInf.CPUtime = String.Format("{0}:{1}:{2}", (cputime.TotalHours - 1 < 0 ? 0 : cputime.TotalHours - 1).ToString("##0"), cputime.Minutes.ToString("00"), cputime.Seconds.ToString("00")); //format cpu time to look like hhh:mm:ss
            }
            catch (Exception ex)
            {
                PInf.CPUtime = "Нет доступа";
            }
            PInf.FizMEMusage = (p.WorkingSet / 1024).ToString() + " КБ";  //ФИЗ память
            PInf.PeakFizMEMusage = (p.PeakWorkingSet / 1024).ToString() + " КБ";
            PInf.VirtMEMusage = (p.VirtualMemorySize / 1024).ToString() + " КБ";
            PInf.PeakVirtMEMusage = (p.PeakVirtualMemorySize / 1024).ToString() + " КБ";
            PInf.PagedMEMSize = (p.PagedMemorySize / 1024).ToString() + " КБ";
            PInf.PagedSysMEMSize = (p.PagedSystemMemorySize / 1024).ToString() + " КБ";
            PInf.NonpagedSysMEMSize = (p.NonpagedSystemMemorySize / 1024).ToString() + " КБ";
            PInf.Handles = p.HandleCount.ToString();
            PInf.Threads = p.Threads.Count.ToString();
            // PInf.MachineName = p.MachineName;
            try
            {
                PInf.CPU = p.ProcessorAffinity.ToString();
            }
            catch 
            {
                PInf.CPU = Environment.ProcessorCount.ToString();
            }
            PInf.SessionID = p.SessionId.ToString();
            try
            {
                DateTime time = p.StartTime;
                PInf.StartTime = String.Format("{0},{1}", time.ToLongDateString(), time.ToLongTimeString());
            }
            catch 
            {
                PInf.StartTime = "Нет доступа";
            }
      
            try
            {
                switch (p.PriorityClass)
                {
                    case ProcessPriorityClass.AboveNormal: PInf.Priority = "Выше среднего"; break;
                    case ProcessPriorityClass.BelowNormal: PInf.Priority = "Ниже среднего"; break;
                    case ProcessPriorityClass.High: PInf.Priority = "Высокий"; break;
                    case ProcessPriorityClass.Idle: PInf.Priority = "Низкий"; break;
                    case ProcessPriorityClass.Normal: PInf.Priority = "Средний"; break;
                    case ProcessPriorityClass.RealTime: PInf.Priority = "Реального времени"; break;
                }
            }
            catch 
            {
                PInf.Priority = "Средний";
            }

        }

        void DataAdd(params object[] item)
        {
            try
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    delegDataAdd d = new delegDataAdd(DataAdd);
                    this.Invoke(d, new object[] { item });
                }
                else
                {
                    this.dataGridView1.Rows.Add(item);
                }
            }
            catch { }
        }
        void GetDataValue(int nRow, int nCell)
        {
            try
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    delegGetDataValue d = new delegGetDataValue(GetDataValue);
                    this.Invoke(d, new object[] { nRow, nCell });
                }
                else
                {
                    DataValue = this.dataGridView1.Rows[nRow].Cells[nCell].Value.ToString();
                }
            }catch{}
        }
        void PutDataValue(int nRow, int nCell,string inf)
        {
            try
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    delegPutDataValue d = new delegPutDataValue(PutDataValue);
                    this.Invoke(d, new object[] { nRow, nCell, inf });
                }
                else
                {
                    dataGridView1.Rows[nRow].Cells[nCell].Value = inf;
                }
            }
            catch { }
        }
        //void PutImag(int nRow, int nCell, Image im)
        //{
        //    if (this.dataGridView1.InvokeRequired)
        //    {
        //        delegPutImag d = new delegPutImag(PutImag);
        //        this.Invoke(d, new object[] { nRow, nCell, im });
        //    }
        //    else
        //    {
        //        dataGridView1.Rows[nRow].Cells[nCell].Value = im;
        //    }
        //}
        void RowsCount()
        { try
           {
            if (this.dataGridView1.InvokeRequired)
            {
                delegRowsCount d = new delegRowsCount(RowsCount);
                this.Invoke(d, new object[] { });
            }
            else
            {
                rowcount = dataGridView1.Rows.Count;
            }
          }catch{}
        }
        void RowsClear()
        {
            try
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    delegRowsClear d = new delegRowsClear(RowsClear);
                    this.Invoke(d, new object[] { });
                }
                else
                {
                    dataGridView1.Rows.Clear();
                }
            }
            catch { }
        }
        void RowsRemove(int Nrow)
        {
           try
          {
            if (this.dataGridView1.InvokeRequired)
            {
                delegRowsRemove d = new delegRowsRemove(RowsRemove);
                this.Invoke(d, new object[] { Nrow });
            }
            else
            {
                 this.dataGridView1.Rows.RemoveAt(Nrow);
            }
           }
             catch { }
        }
        void DataEnab(bool v)
        {
            try
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    delegDataEnab d = new delegDataEnab(DataEnab);
                    this.Invoke(d, new object[] { v });
                }
                else
                {
                    if (!v)
                    {
                        dataGridView1.SuspendLayout();
                        dataGridView1.Enabled = v;
                        listBox2.Enabled = v;
                        listBox3.Enabled = v;
                    }
                    else
                    {
                        dataGridView1.ResumeLayout();
                        dataGridView1.Enabled = v;
                        listBox2.Enabled = v;
                        listBox3.Enabled = v;
                    }
                      // dataGridView1.Visible = v;
                    //    dataGridView1.Enabled = v;
                }
            }
            catch { }
        }
        void SetMaxPrbar(int max)
        {
            try
            {
                if (this.progressBar1.InvokeRequired)
                {
                    delegSetMaxPrbar d = new delegSetMaxPrbar(SetMaxPrbar);
                    this.Invoke(d, new object[] { max });
                }
                else
                {
                    this.progressBar1.Maximum = max;
                }
            }
            catch { }
        }
        void SetValuePrbar(int value)
        {
            try
            {
                if (this.progressBar1.InvokeRequired)
                {
                    delegSetValuePrbar d = new delegSetValuePrbar(SetValuePrbar);
                    this.Invoke(d, new object[] { value });
                }
                else
                {
                    this.progressBar1.Value = value;
                }
            }
            catch { }
        }
        void PrBarVisEnab(bool v)
        {
            try
            {
                if (this.progressBar1.InvokeRequired)
                {
                    delegPrBarVisEnab d = new delegPrBarVisEnab(PrBarVisEnab);
                    this.Invoke(d, new object[] { v });
                }
                else
                {
                    progressBar1.Visible = v;
                    //   progressBar1.Enabled = v;
                }
            }
            catch { }
        }

        private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)  //принажатии на люб кнопку но ставим на правую внутри и отслеж приоритет
        {

            if (e.Button == MouseButtons.Right)
            {
                try
                {
                    информацияОПроцессеToolStripMenuItem.Visible = false;
                    информацияОПроцессеToolStripMenuItem.Enabled = false;
                    dataGridView1.Rows[e.RowIndex].Selected = true; //выделяем

                    int id = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[2].Value);
                    Process p = Process.GetProcessById(id);

                    try
                    {
                        switch (p.PriorityClass)
                        {
                            case ProcessPriorityClass.AboveNormal:
                                {
                                    приор4toolStripMenuItem.Image = Properties.Resources.priority;
                                    приор1ToolStripMenuItem.Image = null;
                                    приор2toolStripMenuItem.Image = null;
                                    приор3ToolStripMenuItem.Image = null;
                                    приор5ToolStripMenuItem.Image = null;
                                    приор6ToolStripMenuItem.Image = null;
                                    break;
                                }
                            case ProcessPriorityClass.BelowNormal:
                                {
                                    приор2toolStripMenuItem.Image = Properties.Resources.priority;
                                    приор1ToolStripMenuItem.Image = null;
                                    приор3ToolStripMenuItem.Image = null;
                                    приор4toolStripMenuItem.Image = null;
                                    приор5ToolStripMenuItem.Image = null;
                                    приор6ToolStripMenuItem.Image = null;
                                    break;
                                }
                            case ProcessPriorityClass.High:
                                {
                                    приор5ToolStripMenuItem.Image = Properties.Resources.priority;
                                    приор1ToolStripMenuItem.Image = null;
                                    приор2toolStripMenuItem.Image = null;
                                    приор3ToolStripMenuItem.Image = null;
                                    приор4toolStripMenuItem.Image = null;
                                    приор6ToolStripMenuItem.Image = null;
                                    break;
                                }
                            case ProcessPriorityClass.Idle:
                                {
                                    приор1ToolStripMenuItem.Image = Properties.Resources.priority;
                                    приор2toolStripMenuItem.Image = null;
                                    приор3ToolStripMenuItem.Image = null;
                                    приор4toolStripMenuItem.Image = null;
                                    приор5ToolStripMenuItem.Image = null;
                                    приор6ToolStripMenuItem.Image = null;
                                    break;
                                }
                            case ProcessPriorityClass.Normal:
                                {
                                    приор3ToolStripMenuItem.Image = Properties.Resources.priority;
                                    приор1ToolStripMenuItem.Image = null;
                                    приор2toolStripMenuItem.Image = null;
                                    приор4toolStripMenuItem.Image = null;
                                    приор5ToolStripMenuItem.Image = null;
                                    приор6ToolStripMenuItem.Image = null;
                                    break;
                                }
                            case ProcessPriorityClass.RealTime:
                                {
                                    приор6ToolStripMenuItem.Image = Properties.Resources.priority;
                                    приор1ToolStripMenuItem.Image = null;
                                    приор2toolStripMenuItem.Image = null;
                                    приор3ToolStripMenuItem.Image = null;
                                    приор4toolStripMenuItem.Image = null;
                                    приор6ToolStripMenuItem.Image = null;
                                    break;
                                }
                        }
                        contextMenuStrip2.Show(Cursor.Position.X, Cursor.Position.Y);
                    }
                    catch
                    {
                        приор3ToolStripMenuItem.Image = Properties.Resources.priority;
                        приор1ToolStripMenuItem.Image = null;
                        приор2toolStripMenuItem.Image = null;
                        приор4toolStripMenuItem.Image = null;
                        приор5ToolStripMenuItem.Image = null;
                        приор6ToolStripMenuItem.Image = null;
                        contextMenuStrip2.Show(Cursor.Position.X, Cursor.Position.Y);
                    }

                }
                catch { }
            }
        }
   
        //---Net---DataGrid2
        private void tick(object sender, EventArgs e) //вывод с netstat на datagrid2
        {
            GC.Collect();           
            myList.Clear();
             
            if (Process.GetProcesses().Length != colv2)   /*если текущее колво процессов не равно колву процессов полученному ранее(т.е. произошли изменения в списке проц удалили или добавили проц)*/
            {
               
                colv2 = Process.GetProcesses().Length;
                dataGridView2.Rows.Clear();
                listBox4.Enabled = false;   //пока обновляется нельзя нажать на листы
                listBox5.Enabled = false;
                netstat();

                foreach (Process p in Process.GetProcesses()) //обновим лист
                {
               
                    KolSt = 0;
                    
                     for (int i = 0; i < myList.Count; i++)
                    {
                        NInf = (NetStat)myList[i];
                        if (NInf.pid == p.Id)  //если пид процесса которой мы узнали работает в сети == пиду текущего выводимого процесса
                        {
                            KolSt++;
                            if (KolSt > 1) //выводим без имени
                            {
                                dataGridView2.Rows.Add("", p.Id, NInf.protocol, NInf.locadr, NInf.vnadr, NInf.sost);
                            }
                            else //выводим имя проц и ниже протоколы
                            {
                                 dataGridView2.Rows.Add(p.ProcessName + ".exe :", "");
                                 KolSt++;
                                 dataGridView2.Rows.Add("", p.Id, NInf.protocol, NInf.locadr, NInf.vnadr, NInf.sost);
                            }
                        }
                    }
                   p.Close();
                }
                listBox4.Enabled = true; //после обновл листы опять доступны
                listBox5.Enabled = true;  
            }
         }
        void netstat()
        {

            ProcessStartInfo startinfo = new ProcessStartInfo(); ;  //параметры процесса
            Process process = null;
            OperatingSystem os;
            StreamReader stdoutreader;           //читатель потока
            string result;
            int indn, indk, st = 0,i=0;
                      
            try
            {
                // Работаем только если это WinNT или более поздняя
                os = Environment.OSVersion;
                if (os.Platform != PlatformID.Win32NT)
                {
                    throw new PlatformNotSupportedException("Поддерживается Windows NT или более поздняя версия.");
                }
                os = null;
               
                //описываем параметры процесса

                startinfo.FileName = "cmd.exe";               // имя исп файла - cmd
                startinfo.Arguments = "/C " + "NETSTAT -aon";  // Ключ /c - выполнение команды
                startinfo.UseShellExecute = false;            // Не используем shellexecute - оболочка ОС
                startinfo.RedirectStandardOutput = true;      // выходные данные из приложения пойдут в поток откуда мы прочитаем
                startinfo.CreateNoWindow = true;              // Не надо окон

                process = Process.Start(startinfo);           // Стартуем
                stdoutreader = process.StandardOutput;         //получаем поток используемый для чтения вывода приложения
               
                while ((result = stdoutreader.ReadLine()) != null) //пока не прочитаем весь поток в result
                {
                    st++; 
                    
                    if (st > 4) //пропуск первых 4 строк из cmd
                    {
                        i++; //движ по мас структур

                        indn = 1; indk = result.IndexOf(" ", indn + 1); //ищем пробел начиная с позиции indn+1 (начало +1) т.е. от первой буквы слова ищем конец слова
                        NInf.protocol = result.Substring(indn, indk - indn); //от indn на длину (конец - начало) - заполняем структуру

                        indn = indk;  //для поиска следующего слова нач индек это конец предыдущего слова
                        while (result[indn] == ' ') indn++;  //пропуск пробелов и увелич нач индекс
                        indk = result.IndexOf(" ", indn + 1);
                        NInf.locadr = result.Substring(indn, indk - indn);

                        indn = indk;
                        while (result[indn] == ' ') indn++;
                        indk = result.IndexOf(" ", indn + 1);
                        NInf.vnadr = result.Substring(indn, indk - indn);

                        indn = indk;
                        while (result[indn] == ' ') indn++;
                        if ((result[indn] >= '0') && (result[indn] <= '9')) //если сосстояния нету то мы дошли до pid т.е. еесли встретили цифру
                            goto m1;
                        indk = result.IndexOf(" ", indn + 1);
                        NInf.sost = result.Substring(indn, indk - indn);

                    m1: indn = indk;
                        while (result[indn] == ' ') indn++;
                        indk = result.Length;
                        NInf.pid = Convert.ToInt32(result.Substring(indn, indk - indn));

                        myList.Add(NInf);  //добавляем в лист текущую заполненную структуру
                   
                    }
                }


                stdoutreader.Close();
                stdoutreader = null;
            }
            catch
            {
                throw;
            }
            finally
            {
                if (process != null)
                {
                    // Закрываем
                    process.Close();
                }

                // Освобождаем
                process = null;
                startinfo = null;

            }
        
        }
        private void dataGridView2_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) //отслеж приор проц
        {
            if (e.Button == MouseButtons.Right)
            {
                try
                {
                    dataGridView2.Rows[e.RowIndex].Selected = true; //выделяем

                    if (String.Compare(dataGridView2.Rows[e.RowIndex].Cells[0].Value.ToString(), "") != 0) //если выбрали стр где есть имя процесса
                    {
                        Process p = Process.GetProcessById
                        (Convert.ToInt32(dataGridView2.Rows[e.RowIndex + 1].Cells[1].Value)); //выбор id процесса в след строке после имени

                        try
                        {
                            switch (p.PriorityClass)
                            {
                                case ProcessPriorityClass.AboveNormal:
                                    {
                                        приор4toolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.BelowNormal:
                                    {
                                        приор2toolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.High:
                                    {
                                        приор5ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.Idle:
                                    {
                                        приор1ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.Normal:
                                    {
                                        приор3ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор5ToolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                                case ProcessPriorityClass.RealTime:
                                    {
                                        приор6ToolStripMenuItem.Image = Properties.Resources.priority;
                                        приор1ToolStripMenuItem.Image = null;
                                        приор2toolStripMenuItem.Image = null;
                                        приор3ToolStripMenuItem.Image = null;
                                        приор4toolStripMenuItem.Image = null;
                                        приор6ToolStripMenuItem.Image = null;
                                        break;
                                    }
                            }
                            contextMenuStrip2.Show(Cursor.Position.X, Cursor.Position.Y);
                        }
                        catch
                        {
                            приор3ToolStripMenuItem.Image = Properties.Resources.priority;
                            приор1ToolStripMenuItem.Image = null;
                            приор2toolStripMenuItem.Image = null;
                            приор4toolStripMenuItem.Image = null;
                            приор5ToolStripMenuItem.Image = null;
                            приор6ToolStripMenuItem.Image = null;
                            contextMenuStrip2.Show(Cursor.Position.X, Cursor.Position.Y);
                        }

                    }
                }
                catch { }
            }
        }

        //--contextmenu2
        private void приор6ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                  Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                  p.PriorityClass = ProcessPriorityClass.RealTime;
                }
                else
                {
                    if (TabPage == 0)
                    {
                        Process p = Process.GetProcessById
                         (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value));
                        p.PriorityClass = ProcessPriorityClass.RealTime;
                    }
                    else if (TabPage == 1)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.PriorityClass = ProcessPriorityClass.RealTime;
                    }
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
        private void приор5ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                    Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                    p.PriorityClass = ProcessPriorityClass.High;
                }
                else
                {
                    if (TabPage == 0)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value));
                        p.PriorityClass = ProcessPriorityClass.High;
                     }
                    else if (TabPage == 1)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.PriorityClass = ProcessPriorityClass.High;
                    }
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
        private void приор4toolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                    Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                    p.PriorityClass = ProcessPriorityClass.AboveNormal;
                }
                else
                {
                    if (TabPage == 0)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value));
                        p.PriorityClass = ProcessPriorityClass.AboveNormal;
                    }
                    else if (TabPage == 1)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.PriorityClass = ProcessPriorityClass.AboveNormal;
                    }
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
        private void приор3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                    Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                    p.PriorityClass = ProcessPriorityClass.Normal;
                }
                else
                {
                    if (TabPage == 0)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value));
                        p.PriorityClass = ProcessPriorityClass.Normal;
                    }
                    else if (TabPage == 1)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.PriorityClass = ProcessPriorityClass.Normal;
                    }
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
        private void приор2toolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                    Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                    p.PriorityClass = ProcessPriorityClass.BelowNormal;
                }
                else
                {
                    if (TabPage == 0)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value));
                        p.PriorityClass = ProcessPriorityClass.BelowNormal;
                    }
                    else if (TabPage == 1)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.PriorityClass = ProcessPriorityClass.BelowNormal;
                    }
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
        private void приор1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                    Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                    p.PriorityClass = ProcessPriorityClass.Idle;
                }
                else
                {
                    if (TabPage == 0)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value));
                        p.PriorityClass = ProcessPriorityClass.Idle;
                    }
                    else if (TabPage == 1)
                    {
                        Process p = Process.GetProcessById
                             (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.PriorityClass = ProcessPriorityClass.Idle;
                    }
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
        private void обновитьToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            try
            {
                if (bigApp == false) //если прилож в маленьком виде
                {
                    if (t != null)
                        if (t.IsAlive)
                        {
                            t.Abort();
                            t.Join();
                            t = null;
                        }
                    colv1 = 0;
                    t = new Thread(UpdateListProc);
                    t.Start();
                }
                else if((bigApp == true) && (TabPage<2))
                {
                    timer1.Stop();
                    if (t1 != null)
                        if (t1.IsAlive)
                        {
                            t1.Abort();
                            t1.Join();
                            t1 = null;
                        }
                    if (tt1 != null)
                        if (tt1.IsAlive)
                        {
                            tt1.Abort();
                            tt1.Join();
                            tt1 = null;
                        }

                    //    if (TabPage == 0) //если мы вызвались в 0 вкладке
                    //      {
                    colv = 0;
                    dataGridView1.Rows.Clear();
                    //     }
                    //     else if (TabPage == 1)
                    //    {
                    colv2 = 0;
                    dataGridView2.Rows.Clear();
                    //    }
                    Thread.Sleep(300);
                    timer1.Start();
                    tt1 = new Thread(AddDelDataGrid);
                    tt1.Start();
                }
                else if ((bigApp == true) && (TabPage == 2))
                {
                 обновитьToolStripMenuItem_Click(new object(),new EventArgs());//обновим службы
                }
            }
            catch { }

        }
        private void завершитьПроцессToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (bigApp == false) //если прилож в маленьком виде
            {
                Object sen = new object(); MouseEventArgs ee = new MouseEventArgs(MouseButtons.Right,0,0,0,0);
                listBox1_MouseDoubleClick(sen, ee);
            }
            else
            {
                if (TabPage == 0) //if open tab0
                {
                    object sen = new object(); DataGridViewCellEventArgs ee =
                        new DataGridViewCellEventArgs(2, dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0]));
                    dataGridView1_CellDoubleClick(sen, ee);
                }
                else if (TabPage == 1)
                {
                    object sen = new object(); DataGridViewCellEventArgs ee =
                        new DataGridViewCellEventArgs(1, dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]));
                    dataGridView1_CellDoubleClick(sen, ee);
                }
            }
        }
        private void завершитьДеревоПроцессовToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (bigApp == false) //если прилож в маленьком виде
            {
                listBox1_KillTreeProc();
            }
            else
            {
                if (TabPage == 0)
                {
                    dataGridView1_KillTreeProc(dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0]));
                }
                else if (TabPage == 1)
                {
                    dataGridView2_KillTreeProc(dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]));
                }
            }
        }
        private void информацияОПроцессеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Form2 frm = new Form2();
                frm.button1.Enabled = true;
                Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));
                try
                {
                    ic = Icon.ExtractAssociatedIcon(p.MainModule.FileName);
                    frm.pictureBox1.Image = ic.ToBitmap();
                }
                catch { frm.pictureBox1.Image = Properties.Resources.system; frm.button1.Enabled = false; }
                try
                {
                    ProcessModule pm = p.MainModule;
                    frm.textBox1.Text = pm.ModuleName;
                      try
                      {
                        frm.textBox2.Text = pm.FileVersionInfo.FileVersion;
                      }
                      catch (Exception ex) { frm.textBox2.Text = ex.Message; frm.button1.Enabled = false; }
                      try
                      {
                        frm.textBox3.Text = File.GetLastWriteTime(pm.FileName).ToShortDateString();
                      }
                      catch (Exception ex) { frm.textBox3.Text = ex.Message; frm.button1.Enabled = false; }
                      try
                      {
                        frm.textBox4.Text = pm.FileName;
                      }
                      catch (Exception ex) { frm.textBox4.Text = ex.Message; frm.button1.Enabled = false; }
                }
                catch (Exception ex) { frm.textBox1.Text = ex.Message; frm.button1.Enabled = false; }
                frm.ShowDialog();

                // Process pp = Process.GetProcessById(frm.pidExplor);
                //  pp.Kill();
                // Process [] pp = Process.GetProcessesByName("Explorer");

                //for (int i=0;i<pp.Length-1;i++)
                //     {
                //         pp[i].Kill();
                //         pp[i].Close();
                //     }
                Object ob = new object(); EventArgs ee = new EventArgs();
                обновитьToolStripMenuItem1_Click(ob, ee);

            }
            catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        //----открытые dll
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                listBox2.Items.Clear();
                listBox3.Items.Clear();
                
                    Process p = Process.GetProcessById
                      (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value)); //выбор id процесса в тек стр SelectedRows
                    listBox2.BeginUpdate();

                    listBox2.Items.Add("           Открытые файлы: ");

                    ProcessModuleCollection m = p.Modules;
                    for (int j = 0; j < m.Count; ++j)
                    {
                        listBox2.Items.Add(m[j].ModuleName);
                    }
            }
            catch (Exception ex)
            {
                listBox2.Items.Add(ex.Message);            }
            finally
            {
                listBox2.EndUpdate();
            }
        }
        private void dataGridView2_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                listBox4.Items.Clear();
                listBox5.Items.Clear();

                if (String.Compare(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0])].Cells[0].Value.ToString(), "") != 0) //если выбрали стр где есть имя процесса
                {
                    Process p = Process.GetProcessById
                    (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value)); //выбор id процесса в след строке после имени

                    listBox4.BeginUpdate();

                    listBox4.Items.Add("           Открытые файлы: ");

                    ProcessModuleCollection m = p.Modules; //сохраняем текущие модули
                    for (int j = 0; j < m.Count; ++j)
                    {
                        listBox4.Items.Add(m[j].ModuleName);
                    }
                }
             }
            catch (Exception ex)
            {
                listBox4.Items.Add(ex.Message);
            }
            finally
            {
                listBox4.EndUpdate();
            }


        }
        private void listBox2_SelectedIndexChanged(object sender, EventArgs e) //когда выбрали какой либо dll или exe
        {
            listBox3.BeginUpdate();
            if (listBox2.SelectedIndex != -1) //если выбрали индекс выше 0 чтобы не выбрать надпись
            {
                if (((listBox2.Items[listBox2.SelectedIndex].ToString().IndexOf(".exe")) > 0) || ((listBox2.Items[listBox2.SelectedIndex].ToString().IndexOf(".dll") > 0))) //если строка содержит .exe или .dll
                {
                    try
                    {
                        Process p = Process.GetProcessById
                       (Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.CurrentRow)].Cells[2].Value));
                        listBox3.Items.Clear();

                        ProcessModule pm = p.Modules[listBox2.SelectedIndex - 1]; //по дата грид по пид находим выделенный процесс p и в нём находим нужный выделенный в лист2 модуль,выделенный-1 т.к. 0 стр это текст которого нет в массиве
                        listBox3.Items.Add("     Информация о модуле: ");
                        listBox3.Items.Add("Имя модуля:                               " + pm.ModuleName);
                        listBox3.Items.Add("Версия модуля:                          " + pm.FileVersionInfo.FileVersion);
                        listBox3.Items.Add("Дата изменения:                       " + File.GetLastWriteTime(pm.FileName).ToShortDateString());
                        listBox3.Items.Add("Путь:                                            " + pm.FileName);
                        listBox3.Items.Add("Адресс в памяти:                       " + pm.BaseAddress);
                        listBox3.Items.Add("Адресс функции модуля:          " + pm.EntryPointAddress);
                        listBox3.Items.Add("Объём памяти для загрузки:   " + pm.ModuleMemorySize);
                      //richTextBox1.Text = "     Информация о модуле: \n" + "Имя модуля:               " + pm.ModuleName;
                    }
                    catch (Exception ex)
                    {
                        listBox3.Items.Add(ex.Message);
                    }
                    finally
                    {
                        listBox3.EndUpdate();
                    }
                }
            }

        }
        private void listBox4_SelectedIndexChanged(object sender, EventArgs e)
        {
            listBox5.BeginUpdate();
            if (listBox4.SelectedIndex != -1) //если выбрали индекс выше 0 чтобы не выбрать надпись
            {
                if (((listBox4.Items[listBox4.SelectedIndex].ToString().IndexOf(".exe")) > 0) || ((listBox4.Items[listBox4.SelectedIndex].ToString().IndexOf(".dll") > 0))) //если строка содержит .exe или .dll
                {
                    try
                    {
                        Process p = Process.GetProcessById
                       (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.CurrentRow)+1].Cells[1].Value));
                        listBox5.Items.Clear();

                        ProcessModule pm = p.Modules[listBox4.SelectedIndex - 1]; //по дата грид по пид находим выделенный процесс p и в нём находим нужный выделенный в лист2 модуль,выделенный-1 т.к. 0 стр это текст которого нет в массиве
                        listBox5.Items.Add("     Информация о модуле: ");
                        listBox5.Items.Add("Имя модуля:                               " + pm.ModuleName);
                        listBox5.Items.Add("Версия модуля:                          " + pm.FileVersionInfo.FileVersion);
                        listBox5.Items.Add("Дата изменения:                       " + File.GetLastWriteTime(pm.FileName).ToShortDateString());
                        listBox5.Items.Add("Путь:                                            " + pm.FileName);
                        listBox5.Items.Add("Адресс в памяти:                       " + pm.BaseAddress);
                        listBox5.Items.Add("Адресс функции модуля:          " + pm.EntryPointAddress);
                        listBox5.Items.Add("Объём памяти для загрузки:   " + pm.ModuleMemorySize);
                    }
                    catch (Exception ex)
                    {
                        listBox5.Items.Add(ex.Message);
                    }
                    finally
                    {
                        listBox5.EndUpdate();
                    }
                }
            }

        }

        //-----службы
        void tabPage3_Enter(object sender, EventArgs e)
        {
            label5.Text = "";
            label6.Text = "";
           
            if (UpdServ == 1)
            {
                UpdServ = 0;                
                dataGridView3.Rows.Clear();
                // Create a new ManagementClass object binded to the Win32_Service WMI class
                ManagementClass mcServices = new ManagementClass("Win32_Service"); //запрос на список сервисов

                // Loop through each service
                foreach (ManagementObject moService in mcServices.GetInstances())
                {
                    srvInf[0] = moService.GetPropertyValue("Caption").ToString(); //получаем подпись(чтобы по руски) если name то по англ
                    if (string.Compare(moService.GetPropertyValue("State").ToString(), "Running") == 0)
                        srvInf[1] = "Работает";
                    else srvInf[1] = "Остановлена";
                    if (string.Compare(moService.GetPropertyValue("StartMode").ToString(), "Auto") == 0)
                        srvInf[2] = "Автоматически";
                    else srvInf[2] = "Вручную";
                    if (string.Compare(moService.GetPropertyValue("ServiceType").ToString(), "Own Process") == 0)
                        srvInf[3] = "Локальная система";
                    else srvInf[3] = "Сетевая служба";
                    srvInf[4] = moService.GetPropertyValue("PathName").ToString();

                    dataGridView3.Rows.Add(srvInf);
                }
            }
        }
        private void dataGridView3_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) //отслеживаем от или запуш службы
        {
            if (e.Button == MouseButtons.Right) //если нажали на прав кн то выпадет меню
            {
                 try
                 {
                     //  DataGridView.HitTestInfo vHitTestInfo;
                    //  vHitTestInfo =  dataGridView3.HitTest(e.X, e.Y); //по координ мыши получаем индексы строки и столбца
                    // // dataGrid1.UnSelect(dataGrid1.CurrentRowIndex); // снимаем выделение
                    ////  dataGrid1.CurrentRowIndex = vHitTestInfo.Row; // устанавливаем выделение
                 
                    dataGridView3.Rows[e.RowIndex].Selected = true;

                    System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController
               (dataGridView3.Rows[e.RowIndex].Cells[0].Value.ToString()); //по имени(подписи) получаем сервис

                    if (string.Compare(sc.Status.ToString(), "Running") == 0)
                    {
                        запуститьToolStripMenuItem.Enabled = false;
                        остановитьToolStripMenuItem.Enabled = true;
                    }
                    else
                    {
                        запуститьToolStripMenuItem.Enabled = true;
                        остановитьToolStripMenuItem.Enabled = false;
                    }
                    contextMenuStrip1.Show(Cursor.Position.X, Cursor.Position.Y);  //делаем так иначе если привязывать его к строкам то не обновляется            
                 }
                 catch { }
            }
                   
        }
        private void dataGridView3_SelectionChanged(object sender, EventArgs e)  //после нажатия на люб кнопку мыши(событие выше) когда выделение изменено
        {
           try{
                ManagementClass mcServices = new ManagementClass("Win32_Service");
                // Loop through each service
                foreach (ManagementObject moService in mcServices.GetInstances())
                {
                  if (String.Compare(moService.GetPropertyValue("Caption").ToString(),
                         dataGridView3.Rows[dataGridView3.Rows.IndexOf(dataGridView3.SelectedRows[0])].Cells[0].Value.ToString()) == 0)
                        {
                            textBox1.Text = moService.GetPropertyValue("Description").ToString();
                            break;
                        }
                }
           }
           catch { }
        } 
        private void запуститьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController
       (dataGridView3.Rows[dataGridView3.Rows.IndexOf(dataGridView3.CurrentRow)].Cells[0].Value.ToString());
            sc.Start();
            sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
            dataGridView3.Rows[dataGridView3.Rows.IndexOf(dataGridView3.CurrentRow)].Cells[1].Value = "Работает";
        }
        private void остановитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController
      (dataGridView3.Rows[dataGridView3.Rows.IndexOf(dataGridView3.CurrentRow)].Cells[0].Value.ToString());
            sc.Stop();
            sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped);
            dataGridView3.Rows[dataGridView3.Rows.IndexOf(dataGridView3.CurrentRow)].Cells[1].Value = "Остановлена";
        }
        private void обновитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            UpdServ = 1;
            Object oo = new object();
            EventArgs ss = new EventArgs();
            tabPage3_Enter(oo,ss);
        }     
       
        //---удалялки  
        private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (listBox1.SelectedIndex != -1) //если выбрали что то
            {
            try
                {
                    Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid)); 
                    p.Kill();
                    p.Close();
                    firstplayDel = true; //чтобы выделить первую позицию в листе
                }
               catch (Exception ex)
               {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
               }
            }              
        }
        private void listBox1_KillTreeProc()
        {
            if (listBox1.SelectedIndex != -1) //если выбрали что то
            {
                int i = listBox1.SelectedIndex; //получаем номер выбранного элемента
                string name = listBox1.Items[i].ToString();
                if (String.Compare(name, 0, "<!> ", 0, 4) == 0)
                    name = name.Substring(4, name.LastIndexOf(".") - 4);  //индекс последнего вхождения . -4 т.к. длина стр начин с 4 позиции
                else name = name.Substring(0, name.LastIndexOf(".")); //убираем расширение
                try
                {
                    foreach (Process p in Process.GetProcessesByName(name)) //получаем массив процессов с данным именем и в нём работаем
                    {
                        p.Kill();
                        p.Close();
                    }
                    firstplayDel = true; //чтобы выделить первую позицию в листе
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) //удаление из 1 дата грд по пид
        {
            if (/*dataGridView1.Rows.IndexOf(dataGridView1.CurrentRow)*/e.RowIndex != -1)
            {
                try
                { 
                Idel = true; //флаг о тои что мы сами удаляем процесс а не он сам ушел
                if (t1 != null)
                    if (t1.IsAlive)
                    {
                        t1.Abort();
                        t1.Join();
                        t1 = null;
                    }
              //  dataGridView1.Visible = false;

                int id = Convert.ToInt32(dataGridView1.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].Cells[2].Value);


                dataGridView1.Rows.RemoveAt(dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0]));
                    Process p = Process.GetProcessById(id); //удаляем проц по id
                    p.Kill();
                    p.Close();


                    // dataGridView1.Rows.Clear();
                    //  dataGridView1.Visible = true;
                    if (t1 == null)        //только если поток рел тайм не существует               
                    {                       //т.к. чтобы в цикле лишний раз его не запустить
                        t1 = new Thread(UpdateDataGrid);
                        t1.Start();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private void dataGridView1_KillTreeProc(int indx) //удаление из 1 дата грд по имени
        {
            if (/*dataGridView1.Rows.IndexOf(dataGridView1.CurrentRow)*/indx != -1)
            {
                Idel = true;
                if (t1 != null)
                    if (t1.IsAlive)
                    {
                        t1.Abort();
                        t1 = null;
                        t1 = null;
                    }

                string name = dataGridView1.Rows[indx].Cells[1].Value.ToString();
                if (String.Compare(name, 0, "<!> ", 0, 4) == 0)
                    name = name.Substring(4, name.LastIndexOf(".") - 4);
                else name = name.Substring(0, name.LastIndexOf(".")); //убираем расширение

                try
                {
                    foreach (Process p in Process.GetProcessesByName(name)) //по имени получаем все проц связ с этим именем
                    {
                        for (int a = 0; a < dataGridView1.RowCount; a++)
                        {
                            if (String.Compare(dataGridView1.Rows[a].Cells[2].Value.ToString(), p.Id.ToString()) == 0)
                                dataGridView1.Rows.RemoveAt(a);
                        }
                        p.Kill();
                        p.Close();
                    }
                    dataGridView1.Rows.Clear();
                    colv = 0;
                    if (t1 == null)        //только если поток рел тайм не существует               
                    {                       //т.к. чтобы в цикле лишний раз его не запустить
                        t1 = new Thread(UpdateDataGrid);
                        t1.Start();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private void dataGridView2_CellDoubleClick(object sender, DataGridViewCellEventArgs e) //удаление из 2 дата грид
        {
            if (e.RowIndex != -1)
            {
                string name = dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0])].Cells[0].Value.ToString();
                if (String.Compare(name, "") == 0)
                { MessageBox.Show("Имя удаляемого процесса не выбрано"); return; }
              
                try
                {
                    Process p = Process.GetProcessById
                    (Convert.ToInt32(dataGridView2.Rows[dataGridView2.Rows.IndexOf(dataGridView2.SelectedRows[0]) + 1].Cells[1].Value));
                        p.Kill();
                        p.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }                       

        }
        private void dataGridView2_KillTreeProc(int indx)
         {
             if (indx != -1)
             {
                 try
                 {
                 string name = dataGridView2.Rows[indx].Cells[0].Value.ToString();
                 if (String.Compare(name, "") == 0)
                 { MessageBox.Show("Имя удаляемого процесса не выбрано"); return; }

                 if (String.Compare(name, 0, "<!> ", 0, 4) == 0)
                     name = name.Substring(4, name.LastIndexOf(".") - 4);
                 else name = name.Substring(0, name.LastIndexOf(".")); //убираем расширение

                     foreach (Process p in Process.GetProcessesByName(name))
                     {
                         p.Kill();
                         p.Close();
                     }
                 }
                 catch (Exception ex)
                 {
                     MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 }
             }                       
         
         }
        
        //статистика
        private void timer2_Tick(object sender, EventArgs e)
        {
            try
            {
                progressBar2.Value = (int)(performanceCounter1.NextValue());
                toolTip1.SetToolTip(progressBar2, "Использованно выделенной памяти: " + progressBar2.Value + "%");
                progressBar3.Value = (int)(performanceCounter2.NextValue());
                toolTip1.SetToolTip(progressBar3, "Загрузка процессора: " + progressBar3.Value + "%");
                progressBar5.Value = (int)(performanceCounter3.NextValue());
                toolTip1.SetToolTip(progressBar5, "Активность жёсткого диска");
                if (XP)
                {
                    progressBar4.Value = (int)(performanceCounter6.NextValue());
                    toolTip1.SetToolTip(progressBar4, "Сетевая активность: " + progressBar4.Value + " Datagrams/sec (IP)");
                }
                else
                {
                    progressBar4.Value = ((int)(performanceCounter4.NextValue())) + ((int)(performanceCounter4.NextValue()));
                    toolTip1.SetToolTip(progressBar4, "Сетевая активность: " + progressBar4.Value + " Datagrams/sec (IPv4/IPv6)");
                }
              }
            catch { }
        }
        private void InfProc()
        {
            while (true)
            {
                tst.Join(250);
                foreach (Process p in Process.GetProcesses())
                {
                    ColvThred += p.Threads.Count; //колво потоков
                    ColvHandles += p.HandleCount;
                }
                if (bigApp) FormText("Kill Processs... " + "(Процессов: " + Process.GetProcesses().Length + " Потоков: " + ColvThred + " Дескрипторов: " + ColvHandles + ")");
                else FormText("Kill Processs... " + "(" + Process.GetProcesses().Length + "-" + ColvThred +"-"+ColvHandles+")");
                ColvThred = 0;
                ColvHandles = 0;

                //   label3.Text = performanceCounter1.NextValue().ToString();
                ManagementObjectSearcher find = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
                try
                {
                    foreach (ManagementObject mo in find.Get())
                    {
                        LabelText(label1, ((int)(((performanceCounter7.NextValue()) / 1024) / 1024)).ToString()/*Convert.ToString((Convert.ToInt32(mo["TotalVirtualMemorySize"])) / 1024)*/); //общая память,на ХР этот запрос WMI не очень коректно работает поэтому через perfomancecounter
                        LabelText(label2, Convert.ToString((Convert.ToInt32(mo["TotalVisibleMemorySize"])) / 1024)); //общая физ память
                        if ((lab3kl % 2) == 0) //сколько раз по лейблу кликнули
                        {
                            toolTip1.SetToolTip(label3, "Свободно общей памяти Мб");
                            LabelText(label3, ((int)((((performanceCounter7.NextValue()) / 1024) / 1024) - (((performanceCounter8.NextValue()) / 1024) / 1024))).ToString() /*Convert.ToString((Convert.ToInt32(mo["FreeVirtualMemory"])) / 1024)*/);
                        }
                        else
                        {
                            toolTip1.SetToolTip(label3, "Использованно общей памяти Мб");
                            LabelText(label3, ((int)(((performanceCounter8.NextValue()) / 1024) / 1024)).ToString()/*Convert.ToString(((Convert.ToInt32(mo["TotalVirtualMemorySize"])) / 1024) - ((Convert.ToInt32(mo["FreeVirtualMemory"])) / 1024))*/);

                        }
                        if ((lab4kl % 2) == 0)
                        {
                            toolTip1.SetToolTip(label4, "Свободно физической памяти Мб");
                            LabelText(label4, Convert.ToString((Convert.ToInt32(mo["FreePhysicalMemory"])) / 1024));
                        }
                        else
                        {
                            toolTip1.SetToolTip(label4, "Использованно физической памяти Мб");
                            LabelText(label4, Convert.ToString(((Convert.ToInt32(mo["TotalVisibleMemorySize"])) / 1024) - ((Convert.ToInt32(mo["FreePhysicalMemory"])) / 1024)));
                        }
                    }
                }
                catch (Exception) { }
            }
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                 if (listBox1.SelectedIndex != -1) //если выбрали что то
                {
                      ListSelect = listBox1.SelectedIndex;
                      Process p = Process.GetProcessById(Convert.ToInt32(Plist[listBox1.SelectedIndex].Pid));

                      label5.Text = "ID: " + p.Id.ToString();
                      label6.Text = "thr: " + p.Threads.Count.ToString();
                }
            }
            catch { }

        }
        private void FormText(string str)
        {
            if (this.InvokeRequired)
            {
                delegFormText d = new delegFormText(FormText);
                this.Invoke(d, new object[] { str });
            }
            else
            {
               this.Text = str;
            }
        }
        //private void SetToolTip(Control control,string str)
        //{
        //    if (this.toolTip1)
        //    {
        //        delegSetToolTip d = new delegSetToolTip(SetToolTip);
        //        this.Invoke(d, new object[] { control,str });
        //    }
        //    else
        //    {
        //        this.toolTip1.SetToolTip(control,str);
        //    }
        //}
        private void label3_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                lab3kl++;
            }
        }
        private void label4_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                lab4kl++;
            }
        }
      
        //-----------Controls
        private void button1_Click(object sender, EventArgs e) //переход к др виду
        {
           
            if(string.Compare(button1.Tag.ToString(),">")==0)
            {
               
                timer1.Start();  //СТАРТУЕМ net
                tt1 = new Thread(AddDelDataGrid); //datagrid 1 где много инфы
                tt1.Start();

                if (t != null)  //тормозим лист бокс
                    if (t.IsAlive)
                    {
                        t.Abort();
                        t.Join();
                        t = null;
                    }

                button1.Tag = "<";
                toolTip1.SetToolTip(button1, "Свернуть");
                    button1.Image = Properties.Resources.back;

                this.Width = 652;
                panel4.Width = 650;
                button1.Location = new System.Drawing.Point(650-46-10,8); //46 это ширина кнопки,650 длина понели,10 для поправки
                groupBox1.Location = new System.Drawing.Point(214,69);
                progressBar2.Width = 520;
                progressBar3.Width = 520;
                progressBar4.Width = 520;
                progressBar5.Width = 520;
                            
                listBox1.Visible = false;
                listBox1.Enabled = false;
                panel3.Visible = true;
                panel3.Enabled = true;
                panel3.Location = new System.Drawing.Point(0, 98);
                
                panel7.Visible = false;
                panel8.Visible = false;
                button3.Enabled = false;
                if (TabPage == 2)
                    button2.Enabled = false;
                else button2.Enabled = true;
                bigApp = true;  //большой вид ок
             }                      
            else //в таге <
             {
              try
              {
                  timer1.Stop();
                  if (t1 != null)
                      if (t1.IsAlive)
                      {
                          t1.Abort();
                          t1.Join();
                          t1 = null;
                      }
                  if (tt1 != null)
                      if (tt1.IsAlive)
                      {
                          tt1.Abort();
                          tt1.Join();
                          tt1 = null;
                      }
              }
              catch { }

                  t = new Thread(UpdateListProc); 
                  t.Start(); 

            button1.Tag = ">";
            toolTip1.SetToolTip(button1, "Развернуть");
            button1.Image = Properties.Resources.forward;
            button2.Enabled = true;  //если мы нажали когда смотрели службы то эти кнопки были недоступны
            button3.Enabled = true;

            this.Width = 231;
            panel4.Width = 225;
            button1.Location = new System.Drawing.Point(179, 8); //исходная локация кнопки
            groupBox1.Location = new System.Drawing.Point(3, 69);
            progressBar2.Width = 105;
            progressBar3.Width = 105;
            progressBar4.Width = 105;
            progressBar5.Width = 105;

            listBox1.Visible = true;
            listBox1.Enabled = true;
            panel3.Enabled = false;
            panel3.Visible = false;

            panel7.Visible = true;
            panel8.Visible = true;
            button3.Enabled = true;
            listBox1_SelectedIndexChanged(new object(), new EventArgs());   //что бы что то выбрать
            bigApp = false; //большой вид нет
            }
        }
        private void tabControl1_Selected(object sender, TabControlEventArgs e) //смена вкладки
        {
            if ((TabPage=e.TabPageIndex) != 0) //если выбрана НЕ 0 вкладка (с большим списком процессов)
            {
                // чтобы меньше ресурсов ело отменим скан процессов
                if (tt1 != null)
                    if (tt1.IsAlive)
                    {
                        tt1.Abort();
                        tt1.Join();
                        tt1 = null;
                    }
                if (t1 != null)
                    if (t1.IsAlive)
                    {
                        t1.Abort();
                        t1.Join();
                        t1 = null;
                    }
                Tab0st = 1;
            }
            else if (Tab0st == 1) //если уже выбрали 0 вкладку и до этого уже там тормознули все то занаво запустим
            {
                Tab0st = 0; //чтобы если выбрали не 0 вкладку сюда не зайти больше
                TabPage = 0;
                tt1 = new Thread(AddDelDataGrid);
                tt1.Start();
            }

            if (TabPage == 2)
            {
                button2.Enabled = false;
                button3.Enabled = false;
            }
            else
            {
                button2.Enabled = true;
                button3.Enabled = true;
            }
        }
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
             button2_Click(new Object(),new EventArgs());
            }
            if (e.KeyCode == Keys.Space)
            {
             button3_Click(new Object(), new EventArgs());
           }       
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }

        }
        private void button2_Click(object sender, EventArgs e) //кнопка kill
        {
            if (!bigApp) listBox1_MouseDoubleClick(new Object(), new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0)); //задаём любые знач т.к. их в функц не используем
            else if (TabPage == 0) dataGridView1_CellDoubleClick(new Object(), new DataGridViewCellEventArgs(0, 0));
            else if (TabPage == 1) dataGridView2_CellDoubleClick(new Object(), new DataGridViewCellEventArgs(0, 0));
        }
        private void button3_Click(object sender, EventArgs e)  //кнопка инфо
        {
          информацияОПроцессеToolStripMenuItem_Click(new object(), new EventArgs());
        }
        private void button4_Click(object sender, EventArgs e)  //перезапуск оболочки
        {
            foreach (Process p in Process.GetProcessesByName("Explorer"))
            {
                p.Kill();
                p.Close();
             }
            ProcessStartInfo startInfo = null;
            try
            {
                startInfo = new ProcessStartInfo("Explorer");   //процесс на старт
                startInfo.UseShellExecute = true;
                System.Diagnostics.Process.Start(startInfo);
         
            }
            catch (Exception) { }
            finally
            {
                if (startInfo != null) startInfo = null;
            }

        } 
        private void button5_Click(object sender, EventArgs e)
        {
            Form3 frm = new Form3();
            frm.ShowDialog();
        }
        private void button6_Click(object sender, EventArgs e)
        {
            Form4 frm = new Form4();
            frm.ShowDialog();
        }
        private void button7_Click(object sender, EventArgs e)
        {
         обновитьToolStripMenuItem1_Click(new object(),new EventArgs());
        }
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (checkBox1.Checked == true)  //если метка ставиться то дабавим ключь в реестр для автозавпуска
                {
                    Microsoft.Win32.RegistryKey myKey =
                    Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", true);
                    myKey.SetValue("KillProcesss", Application.ExecutablePath);
                }
                else
                {
                    Microsoft.Win32.RegistryKey myKey =
                    Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", true);
                    myKey.DeleteValue("KillProcesss");
                }

                Properties.Settings.Default.autostart = checkBox1.Checked;
                Properties.Settings.Default.Save();
            }
            catch { }
        }
        protected override void OnClosing(CancelEventArgs e) //событие перед закрытием формы
        {
            if (systemShutdown) //если комп выключается
            return;

            base.OnClosing(e);
            DialogResult Result = MessageBox.Show("Скрыть программу? (востановить: ctrl + ~)\n Да - скрыть. Нет - закрыть.", Text, MessageBoxButtons.YesNoCancel,
            MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
            if (Result == DialogResult.Yes)
            {
                e.Cancel = true; this.Hide();  //сворачиваем
                //переходим к первому виду чтобы меньше ресурсов ело
                timer1.Stop();
                if (tt1 != null)
                    if (tt1.IsAlive)
                    {
                        tt1.Abort();
                        tt1.Join();
                        tt1 = null;
                    }
                if (t1 != null)
                    if (t1.IsAlive)
                    {
                        t1.Abort();
                        t1.Join();
                        t1 = null;
                    }

                this.Width = 231;
                button1.Tag = ">";
                button1.Image = Properties.Resources.forward;
                listBox1.Visible = true;
                listBox1.Enabled = true;
                panel3.Enabled = false;
                panel3.Visible = false;
            }
            else if (Result == DialogResult.No) 
            { 
                e.Cancel = false;  //подтвердить закрытие
            }
            else if (Result == DialogResult.Cancel)
            {
                e.Cancel = true;  //отменить закрытие
            }
        }
        //having registered a hotkey the thread that registered it receives a WM_HOTKEY message upon the keypress which has to be caught by overwriting the WndProc method
        protected override void WndProc(ref Message msg)
        {
            // Listen for operating system messages.
            switch (msg.Msg)
            {
                case WM_HOTKEY:   //словили хот кей
                    {
                        if (this.Visible) //если окно открыто
                        {
                            this.Hide();
                            if (bigApp) //если открыто как большое
                            {
                                //переходим к первому виду чтобы меньше ресурсов ело
                                button1.Tag = "<";
                                button1_Click(new object(), new EventArgs()); //там тормознётся t1,tt1 и timer1 и запускаем t1-бокс
                            }
                        }
                        else
                        {
                            this.Show();

                            this.ShowInTaskbar = false;
                            this.WindowState = FormWindowState.Normal;
                            this.StartPosition = FormStartPosition.CenterScreen;
                            this.Location = new System.Drawing.Point((Screen.PrimaryScreen.Bounds.Width / 2) - 115, (Screen.PrimaryScreen.Bounds.Height / 2)-270);
                            //отобращаем по середине экрана т.е ширина(высота) экрана/2=середина и от середины вычисл коорд лев верх угда формы т.к. шир формы 231 то пополам 115
                        }
                    }
                    break;
                case WM_QUERYENDSESSION:   //словили Shutdown
                    systemShutdown = true; //флаг о том что надо выгрузить прогу
                    break;
            }
            base.WndProc(ref msg);
        }

    }
}
